package com.demo.java.OD251_300.OD290;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【探索地块建立】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146081327
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();  // 输入矩阵的行数
        int m = in.nextInt();  // 输入矩阵的列数
        int c = in.nextInt();  // 输入需要查询的矩阵的边长
        int k = in.nextInt();  // 输入判断条件中的阈值

        int[] matrix = new int[n * m]; // 一维数组存储矩阵元素
        for (int i = 0; i < n * m; i++) {
            matrix[i] = in.nextInt();  // 输入矩阵元素
        }

        System.out.println(get_area_count(matrix, n, m, k, c));  // 调用计算矩阵的方法
    }

    public static int get_area_count(int[] mat, int n, int m, int threshold, int c) {
        int[] s = new int[n * m]; // 一维数组存储矩阵元素的前缀和
        for (int i = 0; i < n * m; i++) {
            int row = i / m;  // 计算元素的行号
            int col = i % m;  // 计算元素的列号
            // 计算以当前元素为右下角的边长为1的矩阵的前缀和
            s[i] = mat[i] + (row > 0 ? s[i - m] : 0) + (col > 0 ? s[i - 1] : 0) -
                    (row > 0 && col > 0 ? s[i - m - 1] : 0);
        }

        int ans = 0;
        // 枚举边长为c的矩阵
        for (int i = c - 1; i < n; i++) {
            for (int j = c - 1; j < m; j++) {
                // 计算边长为c的矩阵的前缀和
                int sum = s[i * m + j] - (i - c >= 0 ? s[(i - c) * m + j] : 0) -
                        (j - c >= 0 ? s[i * m + j - c] : 0) +
                        (i - c >= 0 && j - c >= 0 ? s[(i - c) * m + j - c] : 0);

                if (sum >= threshold) {
                    ans++;
                }
            }
        }
        return ans;
    }
}